package com.sduept.nwld.wave.manager;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sduept.core.dao.SuperDAO;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ReportManager {
	@Autowired
	private SuperDAO superDao;
	
	public JSONObject getReport(String fileId){
		JSONObject jsObject = new JSONObject();
		JSONArray jsArr = new JSONArray();
		
		String reportSql = "SELECT fr.device_id,fr.fault_report FROM t_lbtz_fault_report fr WHERE fr.fault_file_id = '"+fileId+"'";
		List<?> reportList = superDao.nativeQuery(reportSql);
		
		String deviceId = null;//device_id
		String xmlStr = null;//xml
		for(Object obj : reportList){
			Object[] objs = (Object[]) obj;
			if(null != objs[0] && !"".equals(objs[0])){
				deviceId = objs[0].toString();
			}
			xmlStr = objs[1].toString();
		}
		
		List<?> aclineList = new ArrayList<Object>();
		if(null != deviceId && !"".equals(deviceId)){
			String aclineSql = "SELECT ca.length,ca.voltage FROM t_cim_aclinesegment ca WHERE ca.id = '"+deviceId+"'";//线长和电压
			aclineList = superDao.nativeQuery(aclineSql);//线长和电压
		}
		
		
		try {
			Document doc = (Document)DocumentHelper.parseText(xmlStr);
			Element rootEle = doc.getRootElement();//根节点
			
			List<?> devList = rootEle.elements("DeviceInfo");//DeviceInfo节点
			JSONObject devJso = new JSONObject();
			JSONArray devArr = new JSONArray();
			for(int i=0; i < devList.size(); i++){
				JSONObject jso = new JSONObject();
				Element ele = (Element) devList.get(i);
				Element name = ele.element("name");
				Element value = ele.element("value");
				jso.put("name", name.getStringValue());
				jso.put("value", value.getStringValue());
				devArr.add(jso);
			}
			devJso.put("DeviceInfo", devArr);
			jsArr.add(devJso);
			
			Element fsTime = rootEle.element("FaultStartTime");//FaultStartTime节点
			JSONObject fsTimeJso = new JSONObject();
			fsTimeJso.put("FaultStartTime", fsTime.getStringValue());
			jsArr.add(fsTimeJso);
			
			List<?> infoList = rootEle.elements("FaultInfo");//FaultInfo节点
			JSONObject infoJso = new JSONObject();
			JSONArray infoArr = new JSONArray();
			for(int i=0; i < infoList.size(); i++){
				JSONObject jso = new JSONObject();
				Element ele = (Element) infoList.get(i);
				Element name = ele.element("name");
				Element value = ele.element("value");
				Element unit = ele.element("unit");
				jso.put("name", name.getStringValue());
				if(null != value && !"".equals(value)){
					jso.put("value", value.getStringValue());
				}
				if(null != unit && !"".equals(unit)){
					jso.put("unit", unit.getStringValue());
				}
				infoArr.add(jso);
			}
			infoJso.put("FaultInfo", infoArr);
			jsArr.add(infoJso);
			
			Element fkTime = rootEle.element("FaultKeepingTime");//FaultKeepingTime节点
			JSONObject fkTimeJso = new JSONObject();
			fkTimeJso.put("FaultKeepingTime", fkTime.getStringValue());
			jsArr.add(fkTimeJso);
			
			List<?> tripInList = rootEle.elements("TripInfo");//TripInfo节点
			JSONObject tripInJso = new JSONObject();
			JSONArray tripInArr = new JSONArray();
			for(int i=0; i < tripInList.size(); i++){
				JSONObject jso = new JSONObject();
				Element ele = (Element) tripInList.get(i);
				Element time = ele.element("time");
				Element name = ele.element("name");
				Element phase = ele.element("phase");
				Element value = ele.element("value");
				jso.put("time", time.getStringValue());
				jso.put("name", name.getStringValue());
				jso.put("phase", phase.getStringValue());
				jso.put("value", value.getStringValue());
				tripInArr.add(jso);
			}
			tripInJso.put("TripInfo", tripInArr);
			jsArr.add(tripInJso);
			
			List<?> digStuList = rootEle.elements("DigitalStatus");//DigitalStatus节点
			JSONObject digStuJso = new JSONObject();
			JSONArray digStuArr = new JSONArray();
			for(int i=0; i < digStuList.size(); i++){
				JSONObject jso = new JSONObject();
				Element ele = (Element) digStuList.get(i);
				Element name = ele.element("name");
				Element value = ele.element("value");
				jso.put("name", name.getStringValue());
				jso.put("value", value.getStringValue());
				digStuArr.add(jso);
			}
			digStuJso.put("DigitalStatus", digStuArr);
			jsArr.add(digStuJso);
			
			Element fileSize = rootEle.element("DataFileSize");//DataFileSize节点
			JSONObject fileSizeJso = new JSONObject();
			fileSizeJso.put("DataFileSize", fileSize.getStringValue());
			jsArr.add(fileSizeJso);
			
			JSONObject aclineObj = new JSONObject();
			JSONArray aclineArr = new JSONArray();
			JSONObject jso = new JSONObject();
			if(aclineList.size() > 0){
				for(Object obj : aclineList){
					jso = new JSONObject();
					Object[] objs = (Object[]) obj;
					jso.put("length", objs[0]);
					jso.put("voltage", objs[1]);
					aclineArr.add(jso);
				}
			}else{
				jso = new JSONObject();
				jso.put("length", "");
				jso.put("voltage", "");
				aclineArr.add(jso);
			}
			aclineObj.put("lenAndVol", aclineArr);
			jsArr.add(aclineObj);
			
			jsObject.put("FaultReport", jsArr);
			
		} catch (DocumentException e) {
			// TODO Auto -generated catch block
			e.printStackTrace();
		}
		return jsObject;
	
	}
	
	/**
	 * 
	 * @param fileId
	 * @return
	 */
	public List<JSONObject> getFaultReport(String reportSql){
		
		List<JSONObject> listObj = new ArrayList<JSONObject>();
		
//		String reportSql = "SELECT fr.device_id,fr.fault_report FROM t_lbtz_fault_report fr WHERE fr.fault_file_id = '"+fileId+"'";
		List<?> reportList = superDao.nativeQuery(reportSql);
		
		for(Object obj : reportList){
			JSONObject jsObject = new JSONObject();
//			JSONArray jsArr = new JSONArray();
			Object[] objs = (Object[]) obj;
			String deviceId = null;
			if(null != objs[0] && !"".equals(objs[0])){
				deviceId = objs[0].toString();//device_id
			}
			String xmlStr = objs[1].toString();//xml
			List<?> aclineList = new ArrayList<Object>();
			if(null != deviceId && !"".equals(deviceId)){
				String aclineSql = "SELECT ca.length,ca.voltage FROM t_cim_aclinesegment ca WHERE ca.id = '"+deviceId+"'";//线长和电压
				aclineList = superDao.nativeQuery(aclineSql);//线长和电压
			}
			
			
			try {
				Document doc = (Document)DocumentHelper.parseText(xmlStr);
				Element rootEle = doc.getRootElement();//根节点
				
				List<?> devList = rootEle.elements("DeviceInfo");//DeviceInfo节点
//				JSONObject devJso = new JSONObject();
				JSONArray devArr = new JSONArray();
				for(int i=0; i < devList.size(); i++){
					JSONObject jso = new JSONObject();
					Element ele = (Element) devList.get(i);
					Element name = ele.element("name");
					Element value = ele.element("value");
					jso.put("name", name.getStringValue());
					jso.put("value", value.getStringValue());
					devArr.add(jso);
				}
//				devJso.put("DeviceInfo", devArr);
//				jsArr.add(devJso);
				jsObject.put("DeviceInfo", devArr);
				
				Element fsTime = rootEle.element("FaultStartTime");//FaultStartTime节点
//				JSONObject fsTimeJso = new JSONObject();
//				fsTimeJso.put("FaultStartTime", fsTime.getStringValue());
//				jsArr.add(fsTimeJso);
				jsObject.put("FaultStartTime", fsTime.getStringValue());
				
				List<?> infoList = rootEle.elements("FaultInfo");//FaultInfo节点
//				JSONObject infoJso = new JSONObject();
				JSONArray infoArr = new JSONArray();
				for(int i=0; i < infoList.size(); i++){
					JSONObject jso = new JSONObject();
					Element ele = (Element) infoList.get(i);
					Element name = ele.element("name");
					Element value = ele.element("value");
					Element unit = ele.element("unit");
					jso.put("name", name.getStringValue());
					if(null != value && !"".equals(value)){
						jso.put("value", value.getStringValue());
					}
					if(null != unit && !"".equals(unit)){
						jso.put("unit", unit.getStringValue());
					}
					infoArr.add(jso);
				}
//				infoJso.put("FaultInfo", infoArr);
//				jsArr.add(infoJso);
				jsObject.put("FaultInfo", infoArr);
				
				Element fkTime = rootEle.element("FaultKeepingTime");//FaultKeepingTime节点
//				JSONObject fkTimeJso = new JSONObject();
//				fkTimeJso.put("FaultKeepingTime", fkTime.getStringValue());
//				jsArr.add(fkTimeJso);
				jsObject.put("FaultKeepingTime", fkTime.getStringValue());
				
				List<?> tripInList = rootEle.elements("TripInfo");//TripInfo节点
//				JSONObject tripInJso = new JSONObject();
				JSONArray tripInArr = new JSONArray();
				for(int i=0; i < tripInList.size(); i++){
					JSONObject jso = new JSONObject();
					Element ele = (Element) tripInList.get(i);
					Element time = ele.element("time");
					Element name = ele.element("name");
					Element phase = ele.element("phase");
					Element value = ele.element("value");
					jso.put("time", time.getStringValue());
					jso.put("name", name.getStringValue());
					jso.put("phase", phase.getStringValue());
					jso.put("value", value.getStringValue());
					tripInArr.add(jso);
				}
//				tripInJso.put("TripInfo", tripInArr);
//				jsArr.add(tripInJso);
				jsObject.put("TripInfo", tripInArr);
				
				List<?> digStuList = rootEle.elements("DigitalStatus");//DigitalStatus节点
//				JSONObject digStuJso = new JSONObject();
				JSONArray digStuArr = new JSONArray();
				for(int i=0; i < digStuList.size(); i++){
					JSONObject jso = new JSONObject();
					Element ele = (Element) digStuList.get(i);
					Element name = ele.element("name");
					Element value = ele.element("value");
					jso.put("name", name.getStringValue());
					jso.put("value", value.getStringValue());
					digStuArr.add(jso);
				}
//				digStuJso.put("DigitalStatus", digStuArr);
//				jsArr.add(digStuJso);
				jsObject.put("DigitalStatus", digStuArr);
				
				Element fileSize = rootEle.element("DataFileSize");//DataFileSize节点
//				JSONObject fileSizeJso = new JSONObject();
//				fileSizeJso.put("DataFileSize", fileSize.getStringValue());
//				jsArr.add(fileSizeJso);
				jsObject.put("DataFileSize", fileSize.getStringValue());
				
//				JSONObject aclineObj = new JSONObject();
				JSONArray aclineArr = new JSONArray();
				JSONObject jso = new JSONObject();
				if(aclineList.size() > 0){
					for(Object objA : aclineList){
						jso = new JSONObject();
						Object[] objsA = (Object[]) objA;
						jso.put("length", objsA[0]);
						jso.put("voltage", objsA[1]);
						aclineArr.add(jso);
					}
				}else{
					jso = new JSONObject();
					jso.put("length", "");
					jso.put("voltage", "");
					aclineArr.add(jso);
				}
//				aclineObj.put("lenAndVol", aclineArr);
//				jsArr.add(aclineObj);
				jsObject.put("lenAndVol", aclineArr);
				jsObject.put("faultFileId", objs[2].toString());
				jsObject.put("deviceId", objs[0].toString());
//				jsObject.put("FaultReport", jsArr);
				listObj.add(jsObject);
				
			} catch (DocumentException e) {
				e.printStackTrace();
			}
		}
		
		return listObj;
	}
	
}
